#include <time.h>
#include <stdio.h>
#include "admin.h"
#include "teacher.h"
#include "getch.h"
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include"tools.h"

const char* tea_passwd="123456";
/*记录添加学生的个数*/
int stu_n=0;
 
extern struct Teacher tea[10];
extern struct Student stu[100];
int tea_n;
int flag=0;
/*学生学号的起始数字*/
const int stu_job_num = 18001;
/*学生的初始密码*/
const char stu_password[7] = "123456"; 
/*生日判断*/
int Get_birth(char* ID)
{
	struct tm *t;  
	time_t tt;  
	time(&tt);  
	t = localtime(&tt);
	char mon=t->tm_mon+1;
	char day=t->tm_mday;
	char birth[4];
	int j=0;
	for(int i=10;i<14;i++)
	{
		birth[j++]=ID[i];
	
	}

	char mon1=(birth[0]-48)*10+(birth[1]-48);
	char day1=(birth[2]-48)*10+(birth[3]-48);
	if(mon==mon1&&day==day1)
	{

		printf("今天是%hd月%hd日\n",mon,day);
		return 1;
	}
	return 0;
}

/*生日提醒*/
void Rmind_birth()
{
	for(int i=0;i<stu_n;i++)
	{
		if(Get_birth(stu[i].ID))
		{
			printf("今天是%s的生日\n",stu[i].Name);
		}
	}

	puts("------按任意键继续------");
	getchar();
	return;
}


/*教师的显示界面*/
void Teacher_printf()
{
	int choice;
	while(1)
	{
		
		do
		{
			system("clear");
			puts("-----教师可选择功能-----");
			puts("    1---生日提醒");
			puts("    2---添加学生");
			puts("    3---删除学生");
			puts("    4---查找学生");
			puts("    5---修改学生信息");
			puts("    6---录入学生成绩");
			puts("    7---重置学生密码");
			puts("    8---显示所有在校学生信息");
			puts("    9---显示所有退学学生信息");
			puts("    10--返回登录界面");
			puts("------------------------");
			printf("请输入选择序号：");

			scanf("%d",&choice);
			getchar();
		}while(choice < 1 ||choice > 10);

		switch(choice)
		{
			case BIR_STU: Rmind_birth(); break;
			case ADD_STU: ADD_Student();		  break;
			case DEL_STU: RM_Student();	 		  break;
			case FIN_STU: FIND(); 		 	 	  break;
			case REV_STU: Rev_student(); 		  break;
			case INP_STU: Input_score(); 		  break;
			case RES_STU: Res_stupasswd();        break;
			case SHOW_Y_STU: Show_y_stu();     	  break;
			case SHOW_N_STU: Show_n_stu();     	  break;
			case Return: return ;
		}
	}
}


/*查询教师的工号，返回的是数组下标*/
int Search_T_Jobname(int n)
{
	int i;
	for(i = 0; i < tea_n; i++)
	{
		if(n == tea[i].Jobname)
		{
			return i;
		}
	}
	return -1;
}


/*教师密码登录界面*/
void Teacher_login()
{
	
	int jobname;
	char temp1[10],temp2[10];
	char mima[10];
	int index;
	while(1)
	{
log:	printf("请输入教师工号:");
		scanf("%d",&jobname);
		getchar();
		
		index = Search_T_Jobname(jobname);
		if(index==-1)
		{
			puts("没有该教师!");
			goto log;
		}
		if(tea[index].first_load)
		{
			while(1)
			{
				puts("请输入密码:");
				get_pwd(mima);
				printf("\n");
				if(strcmp(mima,tea[index].passwd)!=0)
				{
					puts("密码错误!");
					continue;
				}
				flag=1;
				return;
			}
		}
		else
		{
			while(1)
			{
				puts("第一次登录---请修改密码!\n");
				puts("请输入初始密码:");
				get_pwd(mima);
				printf("\n");
				if(strcmp(mima,tea_passwd)!=0)
				{
					puts("密码错误!");
					continue;
				}
				else
				{
					puts("请输入新密码:");
					get_pwd(temp1);
					printf("\n");

					puts("请确认新密码:");
					get_pwd(temp2);
					if(strcmp(temp1,temp2)!=0)
					{
						puts("");
						printf("两次输入不一样,重置失败!");
						continue;
					}
			
					else
					{
						strcpy(tea[index].passwd,temp1);
						tea[index].first_load=1;
						puts("---修改密码成功,按任意键返回---");
						getchar();
						return;
					}
				}
				
			}
		}
	}
}

void Teacher()
{
	Teacher_login();
	if(flag == 1)
	{
		Teacher_printf();
	}
}
/*删除学生*/
void RM_Student()
{
	int n;
	int index;
	printf("请输入要删除的学生学号: ");
	scanf("%d",&n);
	getchar();
	index = Search_JobName(n);

	if(index == -1 )
	{
		puts("------学号不存在------");
		sleep(2);
		return ;
	}

	if(stu[index].no_work == 1 && stu[index].is_work == 0)
	{
		puts("------学生已删除------");
		sleep(2);
		return ;
	}
	else
	{
		puts("------学生信息为------");
		Student_show_single(index);
		printf("---是否确认删除---(y/n)\n");
		char c =getchar();
		getchar();
		if(c == 'y')
		{
			for(int i = 0; i < 100; i++)
			{
				if(stu[i].JobName == n && stu[i].is_work)
				{
					stu[i].no_work = 1;
					stu[i].is_work = 0;
					printf("--------已经删除--------\n");
					puts("------按任意键返回------");
					getchar();
					return ;
				}
			}
		}
		else
		{
			printf("没有删除！\n");
			puts("------按任意键继续------");
			getchar();
		}

	}
}

/*重置学生的密码*/
void Res_stupasswd()
{
	int n;
	int index;
	printf("请输入学生学号:");
	scanf("%d",&n);
	getchar();

	index = Search_JobName(n);
	if(index == -1)
	{
		puts("------学生不存在------");
		sleep(1);
		return ;
	}

	printf("是否重置学生%s的密码(y / n) ",stu[index].Name);
	char c = getchar();
	getchar();
	if(c == 'y')
	{
		strcpy(stu[index].passwd,stu_password);
		puts("重置密码成功!");
		sleep(2);
		return ;
	}
	else
	{
		puts("-----按任意键返回-----");
		getchar();
		return;
	}

}
/*通过姓名 学号查找 组合在一起的函数*/
void FIND()
{
	int choice = 0;
	while(1)
	{
		system("clear");
		puts("--------------------");
		puts("    1---通过姓名查找");
		puts("    2---通过学号查找");
		puts("    3---返回上一级");
		puts("--------------------");
		printf("请输入选择序号: ");
		scanf("%d",&choice);
		getchar();
		if( choice <1 || choice >3)
		{
			continue;
		}
		switch(choice)
		{
			case 1:Search_student_name();		 break;
			case 2:Search_student_JobName(); 	 break;
			case 3: return;
		}
	}
	
}

/*通过姓名查找学生 返回的是数组下标*/
int Search_name(char name[])
{
	int i;
	for(i = 0; i < stu_n; i++)
	{
		if(strcmp(stu[i].Name , name) == 0)
		{
			return i;
		}
	}
	return -1;

}

/*按姓名查询学生信息*/
void Search_student_name()
{
	while(1)
	{
		char name[20];
		int index;

		printf("请输入要查询的学生姓名：");
		scanf("%s",name);
		getchar();
		index = Search_name(name);

		if(index == -1)
		{
			printf("学生不存在！\n");
		}
		else
		{
			printf("你要查询的学生信息为：\n");
			Student_show_single(index);//显示学生的信息函数
		}

		printf("是否继续？（y/n）");
		if(getchar() == 'n')
		{
			break;
		}

	}
}


/*录入学生成绩*/
void Input_score()
{
	
	char t_name[20];
	char s_name[20];
	printf("请输入您的姓名：");
	scanf("%s",t_name);
	getchar();

	int t_i;
	int s_i;
	for( t_i = 0; t_i < tea_n; t_i++)
	{
		if(strcmp(tea[t_i].name ,t_name) == 0)
		{
			break;
		}
	}
	if(t_i >= tea_n)
	{
		puts("error");
		return ;
	}

	if(tea[t_i].p == 'c')
	{
		puts("---您只能修改语文成绩---");
		printf("请输入学生姓名：");
		scanf("%s",s_name);
		getchar();
		s_i = Search_name(s_name);

		if(s_i == -1)
		{
			puts("学生不存在!");
			sleep(1);
			return ;
		}
		else
		{
			while(1)
			{
				printf("语文成绩修改为:");
				scanf("%f",&stu[s_i].Chinese);
				getchar();
				if(stu[s_i].Chinese > 100 || stu[s_i].Math < 0)
				{
					puts("--------ERROR--------");
					puts("--输入范围(1--100)--");
					continue;
				}
				break;
			}

		}
	}
	
	else if(tea[t_i].p == 'm')
	{
		puts("---您只能修改数学成绩---");
		printf("请输入学生姓名：");
		scanf("%s",s_name);
		getchar();
		s_i = Search_name(s_name);
		printf("%d\n",s_i);
		if(s_i == -1)
		{
			puts("学生不存在!");
			sleep(1);
			return;
		}
		else
		{
			while(1)
			{
				printf("数学成绩修改为:");
				scanf("%f",&stu[s_i].Math);
				getchar();
	
				if(stu[s_i].Math > 100 || stu[s_i].Math < 0)
				{
					puts("--------ERROR--------");
					puts("--输入范围(1--100)--");
					continue;
				}
				break;
			}
		}
	}
		
	else if(tea[t_i].p == 'e')
	{
		puts("---您只能修改英语成绩---");
		printf("请输入学生姓名：");
		scanf("%s",s_name);
		getchar();
		s_i = Search_name(s_name);

		if(s_i == -1)
		{
			puts("学生不存在!");
			sleep(1);
			return ;
		}
		else
		{
			while(1)
			{
				printf("英语成绩修改为:");
				scanf("%f",&stu[s_i].English);
				getchar();
				if(stu[s_i].English> 100 || stu[s_i].English < 0)
				{
					puts("--------ERROR--------");
					puts("--输入范围(1--100)--");
					continue;
				}
				break;
			}
		}
	}
	else
	{
		puts("登录错误!");
		getchar();
		getchar();
		return ;
	}
	puts("----您已成功修改成绩----");
	puts("------按任意键继续------");
	getchar();
	return;
}

/*通过学号查找学生 返回的是数组下标*/
int Search_JobName(int JobName)
{
	int i;
	for(i = 0; i < stu_n; i++)
	{
		if(stu[i].JobName == JobName)
		{
			return i;
		}
	}
	return -1;

}
/*通过学号找学生*/
void Search_student_JobName()
{
	while(1)
	{
		int JB;
		int index;

		printf("请输入要查询的学生学号：");
		scanf("%d",&JB);
		getchar();
		index = Search_JobName(JB);

		if(index == -1)
		{
			printf("学生不存在！\n");
		}
		else
		{
			printf("你要查询的学生信息为：\n");
			Student_show_single(index);//显示学生的信息函数
		}

		printf("是否继续？（y/n）");
		if(getchar() == 'n')
		{
			break;
		}
	}
}
//求平均值
float Avg(int n)
{
	return (stu[n].Chinese+stu[n].Math+stu[n].English)/3;
}

/*添加学生信息*/
void ADD_Student()
{
	while(1)
	{
		system("clear");		
		printf("请输入姓名：");
		gets(stu[stu_n].Name);
		
		while(1)
		{
			printf("请输入性别：");
			stu[stu_n].Sex=getchar();
			getchar();

			if(stu[stu_n].Sex != 'f' &&  stu[stu_n].Sex != 'm' )
			{
				puts("--------ERROR-------");
				puts("--输入范围( F / M)--");
				continue;

			}
			break;
		}
		printf("请输入身份号：");
		scanf("%s",stu[stu_n].ID);
		getchar();
		
		printf("您的学号为：%d\n",stu_job_num + stu_n);
		stu[stu_n].JobName = stu_job_num + stu_n;

		while(1)
		{
			printf("请输入语文成绩：");
			scanf("%f",&stu[stu_n].Chinese);
			getchar();

			if(stu[stu_n].Chinese > 100 || stu[stu_n].Chinese <0)
			{
				puts("--------ERROR-------");
				puts("--输入范围(1--100)--");
				continue;
			}
			break;
		}

		while(1)
		{
			printf("请输入数学成绩：");
			scanf("%f",&stu[stu_n].Math);
			getchar();
			if(stu[stu_n].Math > 100 || stu[stu_n].Math <0)
			{
				puts("--------ERROR-------");
				puts("--输入范围(1--100)--");
				continue;
			}
			break;
		}
		
		while(1)
		{
			printf("请输入外语成绩：");
			scanf("%f",&stu[stu_n].English);
			getchar();
			if(stu[stu_n].English > 100 || stu[stu_n].English <0)
			{
				puts("--------ERROR-------");
				puts("--输入范围(1--100)--");
				continue;
			}
			break;
		}
		//计算学生三科成绩的评分
		stu[stu_n].Average =Avg(stu_n);

		//代表学生在校
		stu[stu_n].is_work = 1;
		stu[stu_n].no_work = 0;

		stu_n++; //学生的数量+1
        
		printf("是否继续？（y/n）");
		char c = getchar();
		getchar();
		if(c == 'n')
		{
			
			break;
		}

	}
}

/*显示所有在校学生的信息*/
void Show_y_stu()
{
	printf("所有在校学生为信息：\n");
	printf("学号   姓名        性别  身份证号           语文  数学\
  英语  平均分\n");
	for(int i =0; i < stu_n; i++)
	{
		if(stu[i].is_work !=0 && stu[i].no_work == 0)
		{
			printf("%-7d%-13s%-5c%-19s%-6.1f%-6.1f%-6.1f%-6.1f\n",stu[i].JobName,
			stu[i].Name,stu[i].Sex,stu[i].ID,stu[i].Chinese,stu[i].Math,
			stu[i].English,stu[i].Average);
		}
	}

	puts("------按任意键返回------");
	getchar();
	return ;	
}

/*显示所有退学学生的信息*/
void Show_n_stu()
{
	printf("所有退学学生信息为：\n");
	printf("学号   姓名        性别  身份证号           语文  数学\
  英语  平均分\n");
	for(int i =0; i < stu_n; i++)
	{
		if(stu[i].is_work == 0 && stu[i].no_work != 0)
		{
			printf("%-7d%-13s%-5c%-19s%-6.1f%-6.1f%-6.1f%-6.1f\n",stu[i].JobName,
			stu[i].Name,stu[i].Sex,stu[i].ID,stu[i].Chinese,stu[i].Math,
			stu[i].English,stu[i].Average);
		}
	}

	puts("------按任意键返回------");
	getchar();
	return ;	
}

/*显示单个学生记录*/
void Student_show_single(int n)
{
	//printf("姓名- 性别-身份证号-语文-数学-英语-平均分\n");
	puts("--------------------------------------------------------");
	printf("姓名：%s\n",stu[n].Name);
	printf("学号: %d\n",stu[n].JobName);
	printf("性别：%c\n",stu[n].Sex);
	printf("身份证号：%s\n",stu[n].ID);





/*显示所有在校学生的信息*/
void Show_y_stu()
{
	printf("所有在校学生为信息：\n");
	printf("学号   姓名        性别  身份证号           语文  数学\
  英语  平均分\n");
	for(int i =0; i < stu_n; i++)
	{
		if(stu[i].is_work !=0 && stu[i].no_work == 0)
		{
			printf("%-7d%-13s%-5c%-19s%-6.1f%-6.1f%-6.1f%-6.1f\n",stu[i].JobName,
			stu[i].Name,stu[i].Sex,stu[i].ID,stu[i].Chinese,stu[i].Math,
			stu[i].English,stu[i].Average);
		}
	}

	puts("------按任意键返回------");
	getchar();
	return ;	
}

/*显示所有退学学生的信息*/
void Show_n_stu()
{
	printf("所有退学学生信息为：\n");
	printf("学号   姓名        性别  身份证号           语文  数学\
  英语  平均分\n");
	for(int i =0; i < stu_n; i++)
	{
		if(stu[i].is_work == 0 && stu[i].no_work != 0)
		{
			printf("%-7d%-13s%-5c%-19s%-6.1f%-6.1f%-6.1f%-6.1f\n",stu[i].JobName,
			stu[i].Name,stu[i].Sex,stu[i].ID,stu[i].Chinese,stu[i].Math,
			stu[i].English,stu[i].Average);
		}
	}

	puts("------按任意键返回------");
	getchar();
	return ;	
}

/*显示单个学生记录*/
void Student_show_single(int n)
{
	//printf("姓名- 性别-身份证号-语文-数学-英语-平均分\n");
	puts("--------------------------------------------------------");
	printf("姓名：%s\n",stu[n].Name);
	printf("学号: %d\n",stu[n].JobName);
	printf("性别：%c\n",stu[n].Sex);
	printf("身份证号：%s\n",stu[n].ID);
	printf("语文：%6.2f",stu[n].Chinese);
	printf("  数学：%6.2f",stu[n].Math);
	printf("  英语：%6.2f",stu[n].English);
	printf("  平均分：%6.2f\n",stu[n].Average);
	puts("--------------------------------------------------------");
}
/*修改学生信息*/
void Rev_student()
{
	
	int n;
	int index;
	printf("请输入要修改的学生学号:");
	scanf("%d",&n);

	index = Search_JobName(n);
	if( index == -1)
	{
		puts("学生不存在!");
	}
	else
	{
		system("clear");
		puts("------学生信息为------");
		Student_show_single(index);

		puts("------请输入新值------");
		printf("请输入姓名：");
		scanf("%s",stu[index].Name);
		getchar();
		
		printf("请输入身份证号: ");
		scanf("%s",stu[index].ID);
		getchar();

		printf("请输入语文成绩：");
		scanf("%f",&stu[index].Chinese);
		getchar();

		printf("请输入数学成绩：");
		scanf("%f",&stu[index].Math);
		getchar();

		printf("请输入英语成绩：");
		scanf("%f",&stu[index].English);
		getchar();
		
		stu[index].Average = Avg(index);

		printf("您已成功修改%s的信息\n",stu[index].Name);
		sleep(2);
		//puts("------按任意键返回------");
		//getchar();
	}

}
	printf("语文：%6.2f",stu[n].Chinese);
	printf("  数学：%6.2f",stu[n].Math);
	printf("  英语：%6.2f",stu[n].English);
	printf("  平均分：%6.2f\n",stu[n].Average);
	puts("--------------------------------------------------------");
}
/*修改学生信息*/
void Rev_student()
{
	
	int n;
	int index;
	printf("请输入要修改的学生学号:");
	scanf("%d",&n);

	index = Search_JobName(n);
	if( index == -1)
	{
		puts("学生不存在!");
	}
	else
	{
		system("clear");
		puts("------学生信息为------");
		Student_show_single(index);

		puts("------请输入新值------");
		printf("请输入姓名：");
		scanf("%s",stu[index].Name);
		getchar();
		
		printf("请输入身份证号: ");
		scanf("%s",stu[index].ID);
		getchar();

		printf("请输入语文成绩：");
		scanf("%f",&stu[index].Chinese);
		getchar();

		printf("请输入数学成绩：");
		scanf("%f",&stu[index].Math);
		getchar();

		printf("请输入英语成绩：");
		scanf("%f",&stu[index].English);
		getchar();
		
		stu[index].Average = Avg(index);

		printf("您已成功修改%s的信息\n",stu[index].Name);
		sleep(2);
		//puts("------按任意键返回------");
		//getchar();
	}

}
